/*! \file ModPerFot.c
	\brief Modulo Percistencia de Fotos.

As responsabilidades do Modulo Percistencia fotos e de gericiar o arquivo responsavel por salvar as struturas das fotos em um arquivo
e gerenciar essas detro do arquivo.\n

Arquivo : o Arquivo sera um arquivo de resgistros de tamanho fixo que tera as sequintes caracteristicas:\n
|campo 1= 11 digitos|campo 2= 10 digitos|campo 3= 10 digitos|campo 4= 15 digitos| campo 5= 10 digito|campo 6= 3 digito|campo 7= 3 digito|campo 8= 3 digito|
campo 9= 5 digito|campo 10= 4 digitos|campo 11= 4 digitos|\n

campo 1= chave primeria cpf\n
campo 2= O codigo do abum que a foto pertence (caso nao percentenca a nenhum album ----------) \n
campo 3= O codigo da foto\n
campo 4= nome da foto\n
campo 5= data\n
campo 6= velocidade\n
campo 7= abertura\n
campo 8= iso\n
campo 9= media\n
campo 10= numero de usuarios que votaram\n
campo 11= posicao da proxima foto do album(posicao do registro)\n
 */

#define PerFot_Serv
#include "InPerFot.h"

//lista de fun�oes do modulo
int ValidaOperacao_PF (int TipoErro); //testar , comentar , fazer Interface
int EcontraFoto_PF (FILE*, const char*, const char*, const char*);
int FechaArqui_PF (FILE*);
//fim

int FechaArqui_PF (FILE* Arqui)
{
	fclose (Arqui);
	return 0;
}

int EncontraFoto_PF (FILE* ArquiTexto, const char* CpfPass, const char* CodigAlbumPass, const char* CodigFotoPass)
{
	char CpfPego[12], CodigAlbumPego[11], CodigFotoPega[11];
	int CpfEncon = 0, CodigEncon = 0, i = 0, PosicRegis = 0;
	CpfPego[0] = fgetc (ArquiTexto);
	while (!feof (ArquiTexto))
	{
		CpfEncon = 0;
		CodigEncon = 0;

		for (i = 1; i < 11; i++)
		{
			CpfPego[i] = fgetc (ArquiTexto);
		}
		CpfPego[i] = '\0';

		if (strcmp (CpfPego, CpfPass) == 0)
		{
			fseek (ArquiTexto, 1, SEEK_CUR);

			for (i = 0; i < 10; i++)
			{
				CodigAlbumPego[i] = fgetc (ArquiTexto);
			}
			CodigAlbumPego[i] = '\0';

			if (strcmp (CodigAlbumPego, CodigAlbumPass) == 0)
			{
				fseek (ArquiTexto, 1, SEEK_CUR);

				for (i = 0; i < 10; i++)
				{
					CodigFotoPega[i] = fgetc (ArquiTexto);
				}
				CodigFotoPega[i] = '\0';

				if (strcmp (CodigFotoPega, CodigFotoPass) == 0)
				{
					return PosicRegis;
				}
				else
				{
					CpfEncon = 1;
					CodigEncon = 1;
				}
			}
			else
			{
				CpfEncon = 1;
			}
		}

		fseek (ArquiTexto, (TAMANHOREG_PF - 9) - (CpfEncon * 11) - (CodigEncon * 11), SEEK_CUR);
		PosicRegis++;
		CpfPego[0] = fgetc (ArquiTexto);
	}

	return -1;
}

int ValidaOperacao_PF (int TipoErro) //testar , comentar , fazer Interface
{
	char Exten[] = EXTENSAO_PF, NomeArqui[] = NARQUIVO_PF;
	int Retor;

	if (TipoErro == -1)
	{
		Retor = ReatualizacaoVetBits_VB (NomeArqui, Exten, TAMANHOREG_PF, VARIAVELCONTROLE_PF);
	}

	Retor *= 100;

	return Retor;
}

int PegaFoto_PF (const char* CpfPass, const char* CodigAlbumPass, const char* CodigFotoPass, Foto_PF* FotoPega)
{
	int i, ValorRegis;
	FILE *Arqui;

	Arqui = fopen (ARQUIVO_PF, "r+w");

	if (Arqui == NULL)
	{
		return -1;
	}

	ValorRegis = EncontraFoto_PF (Arqui, CpfPass, CodigAlbumPass, CodigFotoPass);
	if (ValorRegis == -1)
	{
		FechaArqui_PF (Arqui);
		return -2;
	}

	fseek (Arqui, ValorRegis * (TAMANHOREG_PF + 2), SEEK_SET);

	for (i = 0; i < 11; i++)
	{
		fscanf (Arqui, "%c", &FotoPega->CpfUser[i]);
	}

	FotoPega->CpfUser[i] = '\0';

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 10; i++)
	{
		fscanf (Arqui, "%c", &FotoPega->CodigAlbum[i]);
	}
	FotoPega->CodigAlbum[i] = '\0';

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 10; i++)
	{
		fscanf (Arqui, "%c", &FotoPega->CodigFoto[i]);
	}
	FotoPega->CodigFoto[i] = '\0';

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 15; i++)
	{
		fscanf (Arqui, "%c", &FotoPega->Nome[i]);
	}

	FotoPega->Nome[i] = '\0';

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 10; i++)
	{
		fscanf (Arqui, "%c", &FotoPega->Data[i]);
	}
	FotoPega->Data[i] = '\0';

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 3; i++)
	{
		fscanf (Arqui, "%c", &FotoPega->Veloc[i]);
	}
	FotoPega->Veloc[i] = '\0';

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 3; i++)
	{
		fscanf (Arqui, "%c", &FotoPega->Abert[i]);
	}
	FotoPega->Abert[i] = '\0';

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 3; i++)
	{
		fscanf (Arqui, "%c", &FotoPega->Iso[i]);
	}
	FotoPega->Iso[i] = '\0';

	fseek (Arqui, 1, SEEK_CUR);

	fscanf (Arqui, "%d", &FotoPega->NumerVotos);

	fseek (Arqui, 1, SEEK_CUR);

	fscanf (Arqui, "%f", &FotoPega->Media);

	FechaArqui_PF (Arqui);
	return 0;
}

int AtualizaFoto_PF (Foto_PF *NovaFoto)
{
	int i, ValorRegis;
	FILE *Arqui;

	Arqui = fopen (ARQUIVO_PF, "r+w");

	if (Arqui == NULL)
	{
		return -1;
	}

	ValorRegis = EncontraFoto_PF (Arqui, NovaFoto->CpfUser, NovaFoto->CodigAlbum, NovaFoto->CodigFoto);
	if (ValorRegis == -1)
	{
		return -2;
	}

	fseek (Arqui, ValorRegis * (TAMANHOREG_PF + 2), SEEK_SET);

	for (i = 0; i < 11; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->CpfUser[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 10; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->CodigAlbum[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 10; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->CodigFoto[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 15; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Nome[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 10; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Data[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 3; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Veloc[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 3; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Abert[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	for (i = 0; i < 3; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Iso[i]);
	}

	fseek (Arqui, 1, SEEK_CUR);

	fprintf (Arqui, "%4d", NovaFoto->NumerVotos);

	fseek (Arqui, 1, SEEK_CUR);

	fprintf (Arqui, "%.2f", NovaFoto->Media);

	FechaArqui_PF (Arqui);
	return 0;
}

int DeletaFoto_PF (const char* CpfUserPass, const char* CodigAlbumPass, const char* CodigFotoPass)
{
	FILE *ArquiTexto;
	int PosicRegis, ValidOpera, ErroSuces;
	char NomeArqui[] = NARQUIVO_PF;

	ArquiTexto = fopen (ARQUIVO_PF, "r+w");

	if (ArquiTexto == NULL)
	{
		return -1;
	}

	PosicRegis = EncontraFoto_PF (ArquiTexto, CpfUserPass, CodigAlbumPass, CodigFotoPass);

	if (PosicRegis == -1)
	{
		FechaArqui_PF (ArquiTexto);
		return -2;
	}

	fseek (ArquiTexto, (PosicRegis * (TAMANHOREG_PF + 2)), SEEK_SET);

	fprintf (ArquiTexto, "%c", VARIAVELCONTROLE_PF);

	FechaArqui_PF (ArquiTexto);

	ValidOpera = LiberaRegistro_VB ((PosicRegis + 1), NomeArqui);

	ErroSuces = ValidaOperacao_PF (ValidOpera);

	return ErroSuces;
}

int AddFoto_PF (Foto_PF *NovaFoto)
{
	char NomeArqui[] = NARQUIVO_PF;
	int NovaPosic = 0, ErroSuces = 0, i;
	FILE *Arqui;

	Arqui = fopen (ARQUIVO_PF, "r+w");

	if (Arqui == NULL)
	{
		return -1;
	}
	NovaPosic = EncontraFoto_PF (Arqui, NovaFoto->CpfUser, NovaFoto->CodigAlbum, NovaFoto->CodigFoto);
	if (NovaPosic >= 0)
	{
		FechaArqui_PF (Arqui);
		return -2;
	}
	NovaPosic = PreencheRegistro_VB (NomeArqui);

	if (NovaPosic < 0)
	{
		ErroSuces = ValidaOperacao_PF (NovaPosic);

		NovaPosic = PreencheRegistro_VB (NomeArqui);

		if (ErroSuces < 0)
		{
			FechaArqui_PF (Arqui);
			return ErroSuces;
		}

		if (NovaPosic < 0)
		{
			FechaArqui_PF (Arqui);
			return NovaPosic * 100;
		}
	}

	fseek (Arqui, ((NovaPosic - 1) * (TAMANHOREG_PF + 2)), SEEK_SET);

	for (i = 0; i < 11; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->CpfUser[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 10; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->CodigAlbum[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 10; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->CodigFoto[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 15; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Nome[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 10; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Data[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 3; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Veloc[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 3; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Abert[i]);
	}

	fprintf (Arqui, "|");

	for (i = 0; i < 3; i++)
	{
		fprintf (Arqui, "%c", NovaFoto->Iso[i]);
	}

	fprintf (Arqui, "|");

	fprintf (Arqui, "%4d", NovaFoto->NumerVotos);

	fprintf (Arqui, "|");

	fprintf (Arqui, "%.2f", NovaFoto->Media);

	fprintf (Arqui, "\n");

	FechaArqui_PF (Arqui);
	return 0;
}

int ListaFotos_PF (Foto_PF *FotoPass, int Pulo, const char* CpfPass, const char* CodigPass)
{
	FILE *ArquiTexto;
	char Priva, Lixo;
	int PosicAtual = 1, i = 0;

	ArquiTexto = fopen (ARQUIVO_PF, "r");

	if (ArquiTexto == NULL)
	{
		return -1;
	}

	fseek (ArquiTexto, Pulo * (TAMANHOREG_PF), SEEK_SET);

	fscanf (ArquiTexto, "%c", &FotoPass->CpfUser[0]);

	while (!feof (ArquiTexto))
	{
		for (i = 1; i < 11; i++)
		{
			FotoPass->CpfUser[i] = fgetc (ArquiTexto);
		}
		FotoPass->CpfUser[i] = '\0';

		if (strcmp (FotoPass->CpfUser, CpfPass) == 0)
		{
			fseek (ArquiTexto, 1, SEEK_CUR);
			for (i = 0; i < 11; i++)
			{
				FotoPass->CodigAlbum[i] = fgetc (ArquiTexto);
			}
			FotoPass->CodigAlbum[i] = '\0';

			if (strcmp (FotoPass->CodigAlbum, CodigPass) == 0)
			{
				fseek (ArquiTexto, 1, SEEK_CUR);
				for (i = 0; i < 10; i++)
				{
					FotoPass->CodigFoto[i] = fgetc (ArquiTexto);
				}
				FotoPass->CodigFoto[i] = '\0';
				return PosicAtual;
			}
			else
			{
				fseek (ArquiTexto, -10, SEEK_CUR);
			}

		}

		PosicAtual++;

		fseek (ArquiTexto, 73, SEEK_CUR);
		fscanf (ArquiTexto, "%c", &FotoPass->CpfUser[0]);
	}

	return -2;
}



